<?php
// 应用公共文件

use app\api\service\Token;
use app\common\LogService;
use think\facade\Session;

function show($data, $msg, $code)
{
    $data = [
        'msg' => $msg,
        'data' => $data,
        'code' => $code
    ];
    return json($data);
}
function success($data = [], $msg = '操作成功', $code = 200)
{
    return show($data, $msg, $code);
}
function error($msg = '操作失败', $code = 0, $data = [])
{
    return show($data, $msg, $code);
}
function json_msg($msg, $data = [], $code = 200)
{
    $data = [
        'msg' => $msg,
        'data' => $data,
        'code' => $code
    ];
    exit(json_encode($data, JSON_UNESCAPED_UNICODE));
}
function randStr($length = 20)
{
    $str = '';
    $rand = '123456890qwertyuiopasdfghjklzxcvbnm';
    for ($j = 0; $j < $length; $j++) {
        $d = substr($rand, rand(0, strlen($rand) - 1), 1);
        $str .= $d;
    }
    return $str;
}
function getIP()
{
    static $realip;
    if (isset($_SERVER)) {
        if (isset($_SERVER["HTTP_X_FORWARDED_FOR"])) {
            $realip = $_SERVER["HTTP_X_FORWARDED_FOR"];
        } else if (isset($_SERVER["HTTP_CLIENT_IP"])) {
            $realip = $_SERVER["HTTP_CLIENT_IP"];
        } else {
            $realip = $_SERVER["REMOTE_ADDR"];
        }
    } else {
        if (getenv("HTTP_X_FORWARDED_FOR")) {
            $realip = getenv("HTTP_X_FORWARDED_FOR");
        } else if (getenv("HTTP_CLIENT_IP")) {
            $realip = getenv("HTTP_CLIENT_IP");
        } else {
            $realip = getenv("REMOTE_ADDR");
        }
    }
    return $realip;
}

// 计算时间戳天数
function daysUntilTimestamp($timestamp)
{
    // 获取当前时间的时间戳
    $currentTimestamp = time();

    // 计算两个时间戳之间的秒数差
    $secondsDifference = $timestamp - $currentTimestamp;

    // 将秒数差转换为天数差
    $daysDifference = floor($secondsDifference / (60 * 60 * 24));

    return $daysDifference;
}


/**
 * 使用时在try catch内使用
 * @@param String $dir 储存到的目录 public/static/$dir
 */
function file_upload($dir)
{
    $files = request()->file();
    if (!$files) return false;
    validate(['image' => 'fileSize:10240|fileExt:jpg|image:200,200,jpg'])
        ->check($files);
    $img = \think\facade\Filesystem::disk('images')->putFile($dir, $files['img']);
    $img = '/static/images/' . str_replace('\\', '/', $img);
    return $img;
}

// 密码加密
function encrypt_pwd($password)
{
    return md5($password . config('secure.secure_salt'));
}



function getConfig($app, $config)
{
    $data = include app()->getRootPath() . 'app/' . $app . '/config/' . $config . '.php';
    return $data;
}

/*返回得到App配置路径 */
function getAppConfPath($app)
{
    return app()->getRootPath() . 'app/' . $app . '/config/';
}

function addHost($path)
{
    return "http://" . request()->host() . $path;
}

function getUid()
{
    $token = input('token') ?? request()->header('token');
    if (empty($token)) return 0;
    $userData = (new Token)->getTokenVal($token);
    return $userData ? (new Token)->getTokenVal($token)['id'] : 0;
}


/**
 * 格式化消息时间
 * @param int $timestamp
 * @return string
 */
function formatMessageTime($timestamp)
{
    // 如果不是时间戳，转换为时间戳
    if (!is_numeric($timestamp)) {
        $timestamp = strtotime($timestamp);
        if ($timestamp === false) {
            return $timestamp; // 或返回原始值
        }
    }
    $current = time();
    $diff = $current - $timestamp;

    // 10分钟内
    if ($diff < 600) {
        return '刚刚';
    }
    // 1小时内
    if ($diff < 3600) {
        return floor($diff / 60) . '分钟前';
    }
    // 当天内
    if (date('Y-m-d', $current) === date('Y-m-d', $timestamp)) {
        if ($diff < 43200) { // 12小时内
            return floor($diff / 3600) . '小时前';
        }
        return '半天前';
    }
    // 昨天
    if (date('Y-m-d', strtotime('-1 day')) === date('Y-m-d', $timestamp)) {
        return '昨天 ' . date('H:i', $timestamp);
    }
    // 前天
    if (date('Y-m-d', strtotime('-2 day')) === date('Y-m-d', $timestamp)) {
        return '前天 ' . date('H:i', $timestamp);
    }
    // 7天内
    if ($diff < 604800) {
        $weekMap = ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'];
        return $weekMap[date('w', $timestamp)];
    }
    // 一年内
    if (date('Y', $current) === date('Y', $timestamp)) {
        return date('m-d H:i', $timestamp);
    }
    // 超过一年
    return date('Y-m-d H:i', $timestamp);
}


// 只返回图片路径正常的 (上传作用该函数)
function checkImg($images)
{
    // 如果输入为空，直接返回空字符串
    if (empty($images)) {
        return [];
    }
    if (!is_array($images)) {
        $images = explode(',', $images);
    }
    // 过滤空值
    $img = array_filter($images);
    // 检查每个图片是否存在
    foreach ($img as $k => $v) {
        $host = "http://" . request()->host();
        $image = str_replace($host, "", $v);
        $rootPath = app()->getRootPath() . 'public' . $image;
        $img[$k] = $image;
        // $path = addHost($rootPath);
        if (!file_exists($rootPath)) {
            unset($img[$k]);
        }
    }
    return implode(',', $img) ?? [];
}


function addHostForImage($val)
{
    $path = app()->getRootPath() . 'public' . $val;
    if (empty($val) || !file_exists($path)) {
        return addHost('/static/images/avator/avator.gif');
    }
    return addHost($val);
}

function getAdminSessionVal($val = 'id')
{
    return Session::get('admin.' . $val);
}

function recordLog($name, $target_id = null, $user_id = "", $status = 1, $message = "")
{
    $recordLog = LogService::record(
        name: $name,
        target_id: $target_id,
        user_id: $user_id,
        status: $status,
        content: $message == '' ? [] : ['reason' => $message],
        user_type: 2
    );
    return $recordLog;
}

/**
 * 从富文本HTML内容中提取第一张图片的URL
 * @param string $html 富文本内容
 * @return string 成功返回第一张图片的URL，失败则返回空字符串
 */
function getFirstImageFromRichText($html) {
    if (empty($html)) {
        return '';
    }

    // 正则表达式模式，匹配img标签的src属性
    $pattern = '/<img[^>]*src=([\"\']?)([^\"\'>\s]+)\1[^>]*>/i';
    
    // 执行正则匹配
    if (preg_match($pattern, $html, $matches)) {
        // $matches[2] 包含了匹配到的第一个图片URL
        return !empty($matches[2]) ? $matches[2] : '';
    }

    // 未匹配到任何图片则返回空字符串
    return '';
}

/**
 * 使用HTMLPurifier安全过滤富文本HTML，防止XSS
 * @param string $dirtyHtml 用户提交的原始富文本HTML
 * @return string 经过过滤的安全HTML
 */
function remove_xss($dirtyHtml) {

    $config = HTMLPurifier_Config::createDefault();
    $config->set('Core.Encoding', 'UTF-8');
    $config->set('HTML.Allowed', 'p,br,strong,em,u,ul,ol,li,a[href|title],img[src|alt|width|height|style],blockquote,pre,code,span[style],h1,h2,h3,h4,h5,h6,table[border],thead,tbody,tr,td,th');
    // 允许的CSS样式（如果需要）
    // $config->set('CSS.AllowedProperties', 'font-size,font-weight,font-style,text-decoration,color,background-color,text-align,width,height');
    // 允许使用相对路径的图片链接（根据情况设置）
    // $config->set('URI.Base', 'https://yoursite.com');
    // $config->set('URI.MakeAbsolute', true);

    $purifier = new \HTMLPurifier($config);
    $cleanHtml = $purifier->purify($dirtyHtml);
    
    return $cleanHtml;
}

